/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.analyzer;

import android.util.Log;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Classe permettant de parser le flux XML récupérer grâce a la fonction
 * connexion de l'API
 * @author Zanette Sébastien, Andrianjafintrimo Victor
 */
public class ParserConnection extends DefaultHandler {

	// nom des tags XML
	private static final String SESSION = "session"; //$NON-NLS-1$
	private static final String DECONNEXION = "disconnected"; //$NON-NLS-1$
	private static final String PROJECT = "setProject"; //$NON-NLS-1$
	private static final String ID = "id"; //$NON-NLS-1$
	private static final String DECO_ID = "sessionId"; //$NON-NLS-1$
	private static final String PROJECT_ID = "projectId"; //$NON-NLS-1$
	private static final String PROJECT_SESSION_ID = "sessionId"; //$NON-NLS-1$
	// Boolean permettant de savoir si nous sommes � l'int�rieur d'un PROJECT
	//    private boolean inConnexion;
	// Feed courant
	private FeedConnection currentFeed;
	// Buffer permettant de contenir les données d'un tag XML
	private StringBuffer buffer;

	/**
	 * Appelle la fonction processingInstruction de la classe DefaultHandler
	 * @param target
	 * @param data
	 * @throws SAXException
	 */
	@Override
	public void processingInstruction(String target, String data) throws SAXException {
		super.processingInstruction(target, data);
	}

	/**
	 * Constructeur de la classe ParserConnexion
	 */
	public ParserConnection() {
		super();
	}

	/**
	 * Cette méthode est appelée par le parser une et une seule fois au
	 * démarrage de l'analyse de votre flux xml. Elle est appelée avant toutes
	 * les autres méthodes de l'interface, à l'exception unique, évidemment, de
	 * la méthode setDocumentLocator. Cet évènement devrait vous permettre
	 * d'initialiser tout ce qui doit l'être avant le début du parcours du
	 * document.
	 * @throws SAXException 
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();

	}

	/**
	 * Fonction étant déclenchée lorsque le parser trouve un tag XML C'est cette
	 * méthode que nous allons utiliser pour instancier un nouveau feed
	 *
	 * @param uri flux XML
	 * @param localName nom du tag recontré
	 * @param name
	 * @param attributes attributXML
	 * @throws SAXException
	 */
	@Override
	public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
		// Nous réinitialisons le buffer a chaque fois qu'il rencontre un EVENT
		this.buffer = new StringBuffer();

		// Ci dessous, localName contient le nom du tag rencontre

		// Nous avons rencontré un tag SESSION, il faut donc instancier un nouveau feed
		if (localName.equalsIgnoreCase(SESSION)) {
//			Log.v("parse", "creation de feedCo"); //$NON-NLS-1$ //$NON-NLS-2$
			this.currentFeed = new FeedConnection();
			this.currentFeed.setId(attributes.getValue(ID));

		}

		// Nous avons rencontré un tag DECONNEXION, il faut donc  il faut donc instancier un nouveau feed
		if (localName.equalsIgnoreCase(DECONNEXION)) {
			this.currentFeed = new FeedConnection();
			this.currentFeed.setDeconnexionId(attributes.getValue(DECO_ID));

		}

		// Nous avons rencontré un tag PROJECT, il faut donc  il faut donc instancier un nouveau feed
		if (localName.equalsIgnoreCase(PROJECT)) {
			this.currentFeed = new FeedConnection();
			this.currentFeed.setProjectSessionId(attributes.getValue(PROJECT_SESSION_ID));
			this.currentFeed.setProjectId(attributes.getValue(PROJECT_ID));

		}

	}

	/**
	 * Fonction étant déclenchée lorsque le parser a parsé l'intérieur de la
	 * balise XML La méthode characters a donc fait son ouvrage et tous les
	 * caractère inclus dans la balise en cours sont copiés dans le buffer On
	 * peut donc les récupérer pour compléter notre objet currentFeed
	 *
	 * @param uri
	 * @param localName
	 * @param name
	 * @throws SAXException
	 */
	@Override
	public void endElement(String uri, String localName, String name) 
			throws SAXException {
		//TODO Rien à faire ?
	}

	/**
	 * Tout ce qui est dans l'arborescence mais n'est pas partie intégrante d'un
	 * tag, déclenche la levée de cet évènement. En général, cet évènement est
	 * donc levé tout simplement  par la présence de texte entre la balise
	 * d'ouverture et la balise de fermeture
	 * @param ch
	 * @param start
	 * @param length
	 */
	@Override
	public void characters(char[] ch, int start, int length) {
		String lecture = new String(ch, start, length);
		if (this.buffer != null) {
			this.buffer.append(lecture);
		}
	}


	/**
	 * Méthode prmettant de récupérr les données
	 * @return  l'instance courante de FeedConnexion
	 */
	public FeedConnection getData() {
		return this.currentFeed;
	}
}
